"""
FastAPI应用配置文件

本文件负责初始化FastAPI应用，配置中间件、异常处理、路由注册等核心功能。
相关知识点：
- FastAPI框架 (参考文档：技术知识点.md - 1. FastAPI框架)
- 异步编程 (参考文档：技术知识点.md - 5. 异步编程)
- 中间件和拦截器 (参考文档：技术知识点.md - 6. 中间件和拦截器)
- Redis缓存 (参考文档：技术知识点.md - 8. Redis缓存)
- 定时任务调度 (参考文档：技术知识点.md - 7. 定时任务调度)
"""
from contextlib import asynccontextmanager
from fastapi import FastAPI
from config.env import AppConfig  # 应用配置
from config.get_db import init_create_table  # 数据库表初始化
from config.get_redis import RedisUtil  # Redis工具类
from config.get_scheduler import SchedulerUtil  # 定时任务调度器
from exceptions.handle import handle_exception  # 异常处理
from middlewares.handle import handle_middleware  # 中间件处理

# 导入各模块控制器
from module_admin.controller.cache_controller import cacheController
from module_admin.controller.captcha_controller import captchaController
from module_admin.controller.common_controller import commonController
from module_admin.controller.config_controller import configController
from module_admin.controller.dept_controller import deptController
from module_admin.controller.dict_controller import dictController
from module_admin.controller.log_controller import logController
from module_admin.controller.login_controller import loginController
from module_admin.controller.job_controller import jobController
from module_admin.controller.menu_controller import menuController
from module_admin.controller.notice_controller import noticeController
from module_admin.controller.online_controller import onlineController
from module_admin.controller.post_controler import postController
from module_admin.controller.role_controller import roleController
from module_admin.controller.server_controller import serverController
from module_admin.controller.user_controller import userController
from module_generator.controller.gen_controller import genController
from module_stock.controller.basic_controller import basicController
from module_stock.controller.daily_controller import dailyController
from module_stock.controller.weekly_controller import weeklyController
from module_stock.controller.monthly_controller import monthlyController
from module_stock.controller.kline_macd_controller import macdController
from module_stock.controller.kline_boll_controller import bollController

from sub_applications.handle import handle_sub_applications  # 子应用处理
from utils.common_util import worship  # 通用工具函数
from utils.log_util import logger  # 日志工具
from utils.stock_init_util import BollUtil, MacdUtil  # 股票指标初始化工具


# 生命周期事件
@asynccontextmanager
async def lifespan(app: FastAPI):
    """
    FastAPI应用生命周期管理
    
    相关知识点：异步编程 (参考文档：技术知识点.md - 5. 异步编程)
    
    启动阶段：
    1. 记录启动日志
    2. 调用worship函数（可能是自定义的启动消息）
    3. 初始化数据库表
    4. 创建Redis连接池
    5. 初始化系统字典和配置到Redis
    6. 初始化系统定时任务
    
    关闭阶段：
    1. 关闭Redis连接池
    2. 关闭系统定时任务
    """
    # 启动阶段
    logger.info(f'{AppConfig.app_name}开始启动')
    worship()  # 自定义启动消息
    await init_create_table()  # 初始化数据库表
    app.state.redis = await RedisUtil.create_redis_pool()  # 创建Redis连接池
    await RedisUtil.init_sys_dict(app.state.redis)  # 初始化系统字典
    await RedisUtil.init_sys_config(app.state.redis)  # 初始化系统配置
    # 技术指标初始化（当前被注释）
    #await MacdUtil.init_macd_df()
    #await BollUtil.init_boll_df()
    await SchedulerUtil.init_system_scheduler()  # 初始化定时任务
    logger.info(f'{AppConfig.app_name}启动成功')
    
    # 应用运行阶段
    yield
    
    # 关闭阶段
    await RedisUtil.close_redis_pool(app)  # 关闭Redis连接池
    await SchedulerUtil.close_system_scheduler()  # 关闭定时任务


# 初始化FastAPI对象
    """
    FastAPI应用实例初始化
    
    相关知识点：FastAPI框架 (参考文档：技术知识点.md - 1. FastAPI框架)
    
    参数说明：
    - title: 应用名称
    - description: 应用描述
    - version: 应用版本
    - lifespan: 生命周期管理函数
    """
app = FastAPI(
    title=AppConfig.app_name,
    description=f'{AppConfig.app_name}接口文档',
    version=AppConfig.app_version,
    lifespan=lifespan,
    root_path=AppConfig.app_root_path
)

# 挂载子应用
handle_sub_applications(app)

# 加载中间件处理方法
# 相关知识点：中间件和拦截器 (参考文档：技术知识点.md - 6. 中间件和拦截器)
handle_middleware(app)

# 加载全局异常处理方法
# 相关知识点：中间件和拦截器 (参考文档：技术知识点.md - 6. 中间件和拦截器)
handle_exception(app)


# 加载路由列表
# 相关知识点：FastAPI框架 (参考文档：技术知识点.md - 1. FastAPI框架)
# 相关知识点：RESTful API设计 (参考文档：技术知识点.md - 10. RESTful API设计)
controller_list = [
    {'router': loginController, 'tags': ['登录模块']},
    {'router': captchaController, 'tags': ['验证码模块']},
    {'router': userController, 'tags': ['系统管理-用户管理']},
    {'router': roleController, 'tags': ['系统管理-角色管理']},
    {'router': menuController, 'tags': ['系统管理-菜单管理']},
    {'router': deptController, 'tags': ['系统管理-部门管理']},
    {'router': postController, 'tags': ['系统管理-岗位管理']},
    {'router': dictController, 'tags': ['系统管理-字典管理']},
    {'router': configController, 'tags': ['系统管理-参数管理']},
    {'router': noticeController, 'tags': ['系统管理-通知公告管理']},
    {'router': logController, 'tags': ['系统管理-日志管理']},
    {'router': onlineController, 'tags': ['系统监控-在线用户']},
    {'router': jobController, 'tags': ['系统监控-定时任务']},
    {'router': serverController, 'tags': ['系统监控-服务器监控']},
    {'router': cacheController, 'tags': ['系统监控-缓存监控']},
    {'router': commonController, 'tags': ['通用模块']},
    {'router': genController, 'tags': ['代码生成']},
    # 股票相关路由
    {'router': basicController, 'tags': ['股票-股票基本信息']},
    {'router': dailyController, 'tags': ['股票-股票日线信息']},
    {'router': weeklyController, 'tags': ['股票-股票周线信息']},
    {'router': monthlyController, 'tags': ['股票-股票月线信息']},
    {'router': macdController, 'tags': ['股票-技术指标-MACD']},
    {'router': bollController, 'tags': ['股票-技术指标-BOLL']}
]

# 注册所有路由
for controller in controller_list:
    """
    将各模块的路由注册到FastAPI应用
    
    参数说明：
    - router: 路由器对象
    - tags: API文档分组标签
    """
    app.include_router(router=controller.get('router'), tags=controller.get('tags'))
